package com.itheima.d5_proxy2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


/**
 * 创建代理工具类，用来做UserServiceImpl实现类的login,,deleteUsers,selectUsers方法的时间统计
 * long startTime = System.currentTimeMillis();
 * long endTime = System.currentTimeMillis();
 * System.out.println("login方法执行耗时： " + (endTime-startTime)/1000.0 + "s");
 *
 * 弹幕：
 * 一些通用的功能可以通过代理在不修改原代码的情况下为不同对象添加，所以动态代理是很多框架的基础
 * 后面的AOP需要用到反射注解动态代理的知识，现在听个大概，听完AOP再回来听一听就通透了
 */
public class ProxyUtil {
    //弹幕：invoke里面到底是传入的接口还是接口的实现类
    public static UserService createProxy(UserService userService){
        UserService userServiceProxy = (UserService) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),
                new Class[]{UserService.class}, new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                        //指定代理要做UserServiceImpl实现类三个方法的时间统计：
                        if(method.getName().equals("login") || method.getName().equals("deleteUsers")||
                               method.getName().equals("selectUsers")){
                            //代表是在代理这三个方法
                            long startTime = System.currentTimeMillis();

                            Object rs = method.invoke(userService, args);

                            long endTime = System.currentTimeMillis();
                            System.out.println(method.getName() + "方法执行耗时：" + (endTime - startTime)/ 1000.0 + "s");
                            return rs;
                        }else {
                            Object rs = method.invoke(userService, args);
                            return rs;
                        }
                    }
                });
        return userServiceProxy;
    }
}
